﻿package main

import "fmt"

// 用递归方式定义阶乘：0!=1，n!=(n-1)!×n
func calc(n int) int {
    if n == 0 {
        return 1
    }
    return calc(n - 1) * n
}

// 0的阶乘是1，不计算了直接返回结果
// 每次递归前把当前的计算结果传给参数res
// 比如计算10的阶乘，第一次res=10*1
// 然后递归到9的时候，res=9*10*1
// 最后递归到1的时候，res=1*2*...*9*10*1，此时返回res就是阶乘的结果
func calc2(n int, res int) int {
    if n == 0 {
        return 1
    } else if n == 1 {
        return res
    }
    return calc2(n-1, n * res)
}

func main(){
    res := calc(10)
    fmt.Println(res)
    res2 := calc2(10, 1)
    fmt.Println(res2)
}